#pragma once

#include<iostream>
#include<string>
#include<sstream>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>

#include"log.hpp"

class Util
{
public:
    //读取文件内容
    //文件内容可能是字符串，或者二进制等等
    //直接用字符串接收的话，二进制遇到\0就不读了
    //所以要提前准备好字符串大小，全部拷贝
    static bool ReadFile(const std::string &path,std::string *body)
    {
        //获取文件属性(大小)
        struct stat st;
        int n=stat(path.c_str(),&st);
        if(n<0) return false;
        int size=st.st_size;
        body->resize(size);

        //以读方式打开文件
        int fd=open(path.c_str(),O_RDONLY);
        if(fd<0) return false;//不存在该文件
        read(fd,(char*)body->c_str(),size);
        close(fd);

        logMessage(Info,"read file %s done...",path.c_str());
        return true;
    }

    // 从报文中截取请求头
    static std::string ReadOneLine(const std::string &sep,std::string &messgae)
    {
        auto pos=messgae.find(sep,0);
        if(pos==std::string::npos)  return "";
        std::string line=messgae.substr(0,pos);
        messgae.erase(0,pos+sep.size());
        return line;
    }

    //将请求行反序列化
    static bool ParseRequestLine(const std::string &line,std::string *method,std::string *url,std::string *version)
    {
        std::stringstream ss(line);
        ss>>*method>>*url>>*version;
        return true;
    }
};